home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / GNU-TILE-FORTH.lha / src / kernel.h < prev    next >
C/C++ Source or Header  |  1992-05-19  |  12KB  |  658 lines

  1. /*
  2.   C BASED FORTH-83 MULTI-TASKING KERNEL DEFINITIONS
  3.  
  4.   Copyright (C) 1988-1990 by Mikael R.K. Patel
  5.  
  6. */
  7.  
  8.  
  9. /* INCLUDED SYSTEM FUNCTIONS */
  10.  
  11. #include <strings.h>
  12.  
  13.  
  14. /* TYPING SYSTEM AND MISC. STRING MACROS */
  15.  
  16. #define VOID void
  17.  
  18. typedef char*  PTR8;
  19. typedef short* PTR16;
  20. typedef long*  PTR32;
  21.  
  22. typedef VOID (*SUBR)();
  23.  
  24. #define NIL 0
  25.  
  26. typedef long BOOL;
  27.  
  28. #define TRUE  ((BOOL) -1)
  29. #define FALSE ((BOOL)  0)
  30.  
  31. typedef unsigned       NUM;
  32. typedef unsigned char  NUM8;
  33. typedef unsigned short NUM16;
  34. typedef unsigned long  NUM32;
  35.  
  36. typedef int   INT;
  37. typedef char  INT8;
  38. typedef short INT16;
  39. typedef long  INT32;
  40.  
  41. typedef float  FLOAT32;
  42. typedef double FLOAT64;
  43.  
  44. typedef char  CHAR;
  45. typedef char* CSTR;
  46. typedef char* PSTR;
  47.  
  48. #define STREQ(s1, s2) ((*(CSTR) s1 == *(CSTR) s2) && \
  49.                (*(CSTR) s1 + 1 == *(CSTR) s2 + 1) && \
  50.                !(strcmp((CSTR) s1, (CSTR) s2)))
  51.  
  52.  
  53. /* QUEUE DEFINITION */
  54.  
  55. typedef struct _queue {
  56.     struct _queue *succ, *pred;
  57. } queue, *QUEUE;
  58.  
  59.  
  60. /* TASK DEFINITION */
  61.  
  62. typedef struct {
  63.     queue queue;
  64.     INT32 status;
  65.     PTR32 sp;
  66.     PTR32 s0;
  67.     PTR32 ip;
  68.     PTR32 rp;
  69.     PTR32 r0;
  70.     PTR32 fp;
  71.     PTR32 ep;
  72. } task_header;
  73.  
  74. typedef struct {
  75.     queue queue;
  76.     INT32 status;
  77.     PTR32 sp;
  78.     PTR32 s0;
  79.     PTR32 ip;
  80.     PTR32 rp;
  81.     PTR32 r0;
  82.     PTR32 fp;
  83.     PTR32 ep;
  84.     INT32 users[1];
  85. } task, *TASK;
  86.  
  87.  
  88. /* TASK STATUS FIELD VALUES: ENUMERATE */
  89.  
  90. #define TERMINATED 0
  91. #define READY      1
  92. #define RUNNING    2
  93. #define IOWAITING  3
  94. #define WAITING    4
  95. #define DELAYED    5
  96.  
  97.  
  98. /* VOCABULARY ENTRY DEFINITION, TYPES, AND MODES */
  99.  
  100. typedef struct _entry {
  101.     struct _entry *link;
  102.     CSTR  name;
  103.     INT32 mode;
  104.     INT32 code;
  105.     INT32 parameter;
  106. } entry, *ENTRY;
  107.  
  108.  
  109. /* ENTRY MODE VALUES: SET */
  110.  
  111. #define NORMAL      0
  112. #define IMMEDIATE   1
  113. #define EXECUTION   2
  114. #define COMPILATION 4
  115. #define HIDDEN      6
  116. #define PRIVATE     8
  117.  
  118.  
  119. /* ENTRY CODE VALUES: ENUMERATES */
  120.  
  121. #define CODE       0
  122. #define COLON      1
  123. #define VARIABLE   2
  124. #define CONSTANT   3
  125. #define VOCABULARY 4
  126. #define CREATE     5
  127. #define USER       6
  128. #define LOCAL      7
  129. #define FORWARD    8
  130. #define FIELD      9
  131. #define EXCEPTION  10
  132.  
  133.  
  134. /* ENTRY VISIBILITY MACRO */
  135.  
  136. #define visible(e, v) \
  137.     (!(((e -> mode & COMPILATION) && (!state.parameter)) || \
  138.        ((e -> mode & EXECUTION) && (state.parameter))  || \
  139.        ((e -> mode & PRIVATE) && (v != current))))
  140.  
  141.  
  142. /* NORMAL ENTRY GENERATORS */
  143.  
  144. #define NORMAL_CONSTANT(v, l, n, p) \
  145.     static entry v = \
  146.        {(ENTRY) &l, n, NORMAL, CONSTANT, p};
  147.  
  148. #define NORMAL_VARIABLE(v, l, n, p) \
  149.     static entry v = \
  150.        {(ENTRY) &l, n, NORMAL, VARIABLE, p};
  151.  
  152.  
  153. /* VOCABULARY ENTRY DEFINITION */
  154.  
  155. typedef struct {
  156.     ENTRY link;
  157.     CSTR  name;
  158.     INT32 mode;
  159.     INT32 code;
  160.     ENTRY last;
  161.     ENTRY recognizer;
  162. } vocabulary_entry, *VOCABULARY_ENTRY;
  163.  
  164. #define NORMAL_VOCABULARY(v, l, n, p, r) \
  165.     static vocabulary_entry v = \
  166.        {(ENTRY) &l, n, NORMAL, VOCABULARY, (ENTRY) p, (ENTRY) r};
  167.  
  168.  
  169. /* CODE ENTRY DEFINITION */
  170.  
  171. typedef struct {
  172.     ENTRY link;
  173.     CSTR name;
  174.     INT32 mode;
  175.     INT32 code;
  176.     SUBR subr;
  177. } code_entry, *CODE_ENTRY;
  178.  
  179.  
  180. #define NORMAL_CODE(v, l, n, s) \
  181.     static code_entry v = \
  182.        {(ENTRY) &l, n, NORMAL, CODE, s};
  183.  
  184. #define IMMEDIATE_CODE(v, l, n, s) \
  185.     static code_entry v = \
  186.        {(ENTRY) &l, n, IMMEDIATE, CODE, s};
  187.  
  188. #define COMPILATION_CODE(v, l, n, s) \
  189.     static code_entry v = \
  190.        {(ENTRY) &l, n, COMPILATION, CODE, s};
  191.  
  192. #define EXECUTION_CODE(v, l, n, s) \
  193.     static code_entry v = \
  194.        {(ENTRY) &l, n, EXECUTION, CODE, s};
  195.  
  196. #define COMPILATION_IMMEDIATE_CODE(v, l, n, s) \
  197.     static code_entry v = \
  198.        {(ENTRY) &l, n, COMPILATION + IMMEDIATE, CODE, s};
  199.  
  200.  
  201. /* UNIVERSAL VALUE */
  202.  
  203. typedef union {
  204.     BOOL             BOOL;
  205.     NUM32            NUM32;
  206.     INT32            INT32;
  207.     FLOAT32          FLOAT32;
  208.     CSTR             CSTR;
  209.     PTR8             PTR8;
  210.     PTR16            PTR16;
  211.     PTR32            PTR32;
  212.     SUBR             SUBR;
  213.     QUEUE            QUEUE;
  214.     TASK             TASK;
  215.     ENTRY            ENTRY;
  216.     CODE_ENTRY       CODE_ENTRY;
  217.     VOCABULARY_ENTRY VOCABULARY_ENTRY;
  218. } UNIV, *PTR;
  219.  
  220.  
  221. /* STACK MACROS */
  222.  
  223. #define sinit() sp = s0
  224. #define spop(t) tos.t; tos = *sp++
  225. #define spush(e, t) *(--sp) = tos; tos.t = e
  226. #define snth(n) sp[n]
  227. #define sdrop() tos = *sp++
  228. #define sndrop(n) sp += (n); tos = *sp++
  229. #define snip() sp++
  230. #define sdup() *(--sp) = tos
  231. #define sover() { register UNIV t; t = *sp; *(--sp) = tos; tos = t; }
  232. #define stuck() { register UNIV t; t = *sp; *sp = tos; *(--sp) = t; }
  233. #define sswap() { register UNIV t; t = tos; tos = sp[0]; sp[0] = t; }
  234. #define srot()  { register UNIV t; t = tos; tos = sp[1]; sp[1] = sp[0]; sp[0] = t; }
  235. #define sdashrot() { register UNIV t; t = tos; tos = sp[0]; sp[0] = sp[1]; sp[1] = t; }
  236.  
  237. #define coerce(f, t) tos.t = (t) tos.f
  238. #define unary(o, t) tos.t = o tos.t
  239. #define binary(o, t) tos.t = sp++ -> t o tos.t
  240. #define compare(o, t) tos.BOOL = (tos.t o ? TRUE : FALSE)
  241. #define relation(o, t) tos.INT32 = (sp++ -> t o tos.t ? TRUE : FALSE)
  242.  
  243. #define rinit() rp = r0
  244. #define rpop() *rp++
  245. #define rpush(e) *(--rp) = (INT32) e
  246. #define rnth(n) rp[n]
  247. #define rndrop(n) rp += n    
  248.  
  249.  
  250. /* THREADING ALIGNMENT MACRO */
  251.  
  252. #define align(p) p = (PTR32) ((INT32) ((PTR8) p + 3) & -4)
  253.  
  254.  
  255. /* THREADED BRANCH, RETURN MACRO */
  256.  
  257. #define fskip() ip++
  258. #define fbranch(d) ip = (PTR32) ((PTR8) ip + (d))
  259. #define fjump(a) ip = (PTR32) (a)
  260. #define fsemicolon() fjump(rpop())
  261. #define fdoes() current -> last -> code = (INT32) ip; fsemicolon()
  262.  
  263.  
  264. /* ARGUMENT AND LOCAL VARIABLE FRAME MACRO */
  265.  
  266. #define flink() \
  267. { \
  268.     spush(fp, PTR32); \
  269.     fp = (PTR32) sp + *ip++; \
  270.     sp = sp - *ip++; \
  271.     rpush(sp); \
  272.  
  273. #define funlink() \
  274. { \
  275.     register PTR32 t; \
  276.     register PTR32 s; \
  277.     t = (PTR32) rpop(); \
  278.     if (t == (PTR32) sp) { \
  279.     sp = (PTR) fp; \
  280.     fp = tos.PTR32; \
  281.     sdrop(); \
  282.     } \
  283.     else { \
  284.     s = fp; \
  285.     fp = (PTR32) *--t; \
  286.     while (t > (PTR32) sp) *--s = *--t; \
  287.     sp = (PTR) s; \
  288.     } \
  289. }    
  290.  
  291. #define fcatch() \
  292. { \
  293.     PTR32 body; \
  294.     body = spop(PTR32); \
  295.     rpush(tos.INT32); \
  296.     rpush(sp); \
  297.     rpush(ip); \
  298.     rpush(fp); \
  299.     rpush(ep); \
  300.     ep = rp; \
  301.     fjump(body); \
  302. }
  303.  
  304. #define fthrow() \
  305. { \
  306.     ep = (PTR32) rpop(); \
  307.     rndrop(4); \
  308.     fsemicolon() ; \
  309. }
  310.     
  311. /* EXTERN FORWARD DECLARATIONS */
  312.  
  313. extern INT32 verbose;
  314. extern INT32 quited;
  315. extern INT32 running;
  316. extern INT32 tasking;
  317.  
  318. extern TASK tp;
  319. extern TASK foreground;
  320.  
  321. extern UNIV tos;
  322. extern PTR  sp;
  323. extern PTR  s0;
  324.  
  325. extern PTR32 ip;
  326. extern PTR32 rp;
  327. extern PTR32 r0;
  328.  
  329. extern PTR32 fp;
  330. extern PTR32 ep;
  331.  
  332. extern PTR32 dictionary;
  333. extern PTR32 dp;
  334.  
  335. extern vocabulary_entry forth;
  336.  
  337. TASK  make_task();
  338. ENTRY make_entry();
  339.  
  340. VOID kernel_initiate();
  341. VOID kernel_finish();
  342.  
  343. VOID doinner();
  344. VOID docommand();
  345. VOID docall();
  346. VOID doappend();
  347.  
  348.   
  349. /* COMPILER EXTENSIONS */
  350.  
  351. VOID doparenbranch();
  352. VOID doparenqbranch();
  353. VOID doparendo();
  354. VOID doparenqdo();
  355. VOID doparenloop();
  356. VOID doparenplusloop();
  357. VOID doparenliteral();
  358. VOID doparendotquote();
  359. VOID doparenabortquote();
  360. VOID doparensemicolon();
  361. VOID doparendoes();
  362. VOID dothread();
  363. VOID dounthread();
  364. VOID doforwardmark();
  365. VOID dobackwardmark();
  366. VOID doforwardresolve();
  367. VOID dobackwardresolve();
  368.  
  369.  
  370. /* LOCAL VARIABLES AND ARGUMENT BINDING */
  371.  
  372. VOID dounlinklocals();
  373. VOID doparenlink()  ;
  374. VOID doparenunlink()  ;
  375. VOID doparenunlinksemicolon() ;
  376. VOID doparenunlinkdoes();
  377. VOID doparenlocal();
  378. VOID doparenlocalstore();
  379. VOID doparenlocalfetch();
  380. VOID doassignlocal();
  381. VOID dolocalreturn();
  382. VOID docurlebracket();
  383.  
  384.  
  385. /* NULL TERMINATED STRING */
  386.  
  387. VOID doparenquote();
  388. VOID doquote();
  389. VOID doslength();
  390. VOID dosdup();
  391. VOID dosequal();
  392. VOID doscompare();
  393. VOID doscat();
  394. VOID dosprint();
  395.  
  396.  
  397. /* FLOATING POINT NUMBERS */
  398.  
  399. VOID doitof();
  400. VOID doftoi();
  401. VOID dofplus();
  402. VOID dofminus();
  403. VOID doftimes();
  404. VOID dofdivide();
  405. VOID dofonedivide();
  406. VOID dofnegate();
  407. VOID dofdot();
  408. VOID doqfloat();
  409.  
  410.  
  411. /* MEMORY MANAGEMENT */
  412.  
  413. VOID domalloc();
  414. VOID dorealloc();
  415. VOID dofree();
  416.  
  417.  
  418. /* DOUBLE LINKED LISTS */
  419.  
  420. VOID doqemptyqueue();
  421. VOID doenqueue();
  422. VOID dodequeue();
  423.  
  424.  
  425. /* MULTI-TASKING EXTENSIONS */
  426.  
  427. VOID douser();
  428. VOID dotask();
  429. VOID dofork();
  430. VOID doresume();
  431. VOID doschedule();
  432. VOID dodetach();
  433. VOID doterminate();
  434.  
  435.  
  436. /* SIGNAL AND EXCEPTION MANAGEMENT */
  437.  
  438. VOID donewexception();
  439. VOID doparenexceptionsemicolon();
  440. VOID doparenexceptionunlinksemicolon();
  441. VOID doparenexception();
  442. VOID doexception();
  443. VOID doraise();
  444.  
  445.  
  446. /* KERNEL VOCABULARY */
  447.  
  448. VOID doboolean();
  449. VOID donot();
  450. VOID doand();
  451. VOID door();
  452. VOID doxor();
  453. VOID doqwithin();
  454.  
  455. VOID dodepth();
  456. VOID dodrop();
  457. VOID donip();
  458. VOID doswap();
  459. VOID dorot();
  460. VOID dodashrot();
  461. VOID doroll();
  462. VOID doqdup();
  463. VOID dodup();
  464. VOID doover();
  465. VOID dotuck();
  466.  
  467. VOID dotor();
  468. VOID dofromr();
  469. VOID docopyr();
  470.  
  471. VOID dotwotor();
  472. VOID dotwofromr();
  473. VOID dotwodrop();
  474. VOID dotwoswap();
  475. VOID dotworot();
  476. VOID dotwodup();
  477. VOID dotwoover();
  478.  
  479. VOID dolessthan();
  480. VOID doequals();
  481. VOID dogreaterthan();
  482. VOID dozeroless();
  483. VOID dozeroequals();
  484. VOID dozerogreater();
  485. VOID doulessthan();
  486.  
  487. VOID doplus();
  488. VOID dominus();
  489. VOID dooneplus();
  490. VOID dooneminus();
  491. VOID dotwoplus();
  492. VOID dotwominus();
  493. VOID dotwotimes();
  494. VOID doleftshift();
  495. VOID dotimes();
  496. VOID doumtimes();
  497. VOID doumdividemod();
  498. VOID dotwodivide();
  499. VOID dorightshift();
  500. VOID dodivide();
  501. VOID domod();
  502. VOID dodividemod();
  503. VOID dotimesdividemod();
  504. VOID dotimesdivide();
  505. VOID domin();
  506. VOID domax();
  507. VOID doabs();
  508. VOID donegate();
  509.  
  510. VOID dofetch();
  511. VOID dostore();
  512. VOID dowfetch();
  513. VOID dolesswfetch();
  514. VOID dowstore();
  515. VOID docfetch();
  516. VOID doclessfetch();
  517. VOID docstore();
  518. VOID doffetch();
  519. VOID dolessffetch();
  520. VOID dofstore();
  521. VOID dobfetch();
  522. VOID dobstore();
  523. VOID dotwostore();
  524. VOID dotwofetch();
  525. VOID doplusstore();
  526.  
  527. VOID docmove();
  528. VOID docmoveup();
  529. VOID dofill();
  530. VOID docount();
  531. VOID dobounds();
  532. VOID dodashtrailing();
  533. VOID dodashmatch();
  534.  
  535. VOID dobinary();
  536. VOID dooctal();
  537. VOID dodecimal();
  538. VOID dohex();
  539. VOID doconvert();
  540. VOID dolesssharp();
  541. VOID dosharp();
  542. VOID dosharps();
  543. VOID dohold();
  544. VOID dosign();
  545. VOID dosharpgreater();
  546. VOID doqnumber();
  547.  
  548. VOID dodo();
  549. VOID doqdo();
  550. VOID doloop();
  551. VOID doplusloop();
  552. VOID doleave();
  553. VOID doi();
  554. VOID doj();
  555. VOID doif();
  556. VOID doelse();
  557. VOID dothen();
  558. VOID docase();
  559. VOID doof();
  560. VOID doendof();
  561. VOID doendcase();
  562. VOID dobegin();
  563. VOID dountil();
  564. VOID dowhile();
  565. VOID dorepeat();
  566. VOID doagain();
  567. VOID dorecurse();
  568. VOID dotailrecurse();
  569. VOID doexit();
  570. VOID doexecute();
  571. VOID dobye();
  572.  
  573. VOID dodot();
  574. VOID dodotr();
  575. VOID doudot();
  576. VOID doudotr();
  577. VOID doascii();
  578. VOID dodotquote();
  579. VOID dodotparen();
  580. VOID dodots();
  581. VOID docr();
  582. VOID doemit();
  583. VOID dotype();
  584. VOID dospace();
  585. VOID dospaces();
  586.  
  587. VOID dokey();
  588. VOID doexpect();
  589. VOID doline();
  590. VOID dosource();
  591.  
  592. VOID doforth83();
  593. VOID dointerpret();
  594. VOID doquit();
  595. VOID doabort();
  596. VOID doabortquote();
  597.  
  598. VOID dohere();
  599. VOID dotobody();
  600. VOID dodotname();
  601. VOID docells();
  602. VOID docellplus();
  603. VOID dosharpif();
  604. VOID dosharpelse();
  605. VOID dosharpthen();
  606. VOID dosharpifdef();
  607. VOID dosharpifundef();
  608. VOID dosharpinclude();
  609. VOID dosharppath();
  610. VOID doparen();
  611. VOID dobackslash();
  612.  
  613. VOID docomma();
  614. VOID doallot();
  615. VOID doalign();
  616. VOID dodoes();
  617. VOID doimmediate();
  618. VOID doexecution();
  619. VOID docompilation();
  620. VOID doprivate();
  621. VOID dorecognizer();
  622. VOID dobracketcompile();
  623. VOID docompile();
  624. VOID doqcompile();
  625. VOID docompiling();
  626. VOID doliteral();
  627. VOID doleftbracket();
  628. VOID dorightbracket();
  629. VOID doword();
  630.  
  631. VOID dolast();
  632. VOID dodefinitions();
  633. VOID doonly();
  634. VOID doseal();
  635. VOID dorestore();
  636. VOID dotick();
  637. VOID dobrackettick();
  638. VOID dolookup() ;
  639. VOID dofind();
  640. VOID dorecognize();
  641. VOID doforget();
  642. VOID dowords();
  643. VOID doentry();
  644. VOID doforward();
  645. VOID docode();
  646. VOID docolon();
  647. VOID dosemicolon();
  648. VOID docreate();
  649. VOID dovariable();
  650. VOID doconstant();
  651. VOID dovocabulary();
  652. VOID dofield();
  653.  
  654. #ifdef PROFILE
  655. VOID docollision();
  656. #endif
  657.